package net.oxygen.upload.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.ExternalDocumentation;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import io.swagger.v3.oas.models.servers.Server;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;

/**
 * Knife4j接口文档配置
 * <p>
 * 配置API文档的基本信息、分组、安全认证等
 * 访问地址：
 * - Knife4j增强文档: http://localhost:8080/doc.html
 * - 原生Swagger文档: http://localhost:8080/swagger-ui/index.html
 * </p>
 *
 * @author chenweiwei
 * @version 1.0
 * @since 2023-03-24
 */
@Configuration
public class Knife4jConfig {

        /**
         * 配置OpenAPI基本信息
         * <p>
         * 定义API文档标题、描述、版本、许可证、联系方式等元数据
         * </p>
         *
         * @return OpenAPI对象
         */
        @Bean
        public OpenAPI customOpenAPI() {
                return new OpenAPI()
                                // 设置API基本信息
                                .info(new Info()
                                                .title("MinIO文件上传系统API文档")
                                                .version("2.0")
                                                .description("基于MinIO的文件上传系统，提供文件上传、秒传、分片上传等功能")
                                                .termsOfService("https://gitee.com/oxygen_oO/minio-upload")
                                                .license(new License()
                                                                .name("MIT License")
                                                                .url("https://gitee.com/oxygen_oO/minio-upload/blob/master/LICENSE"))
                                                .contact(new Contact()
                                                                .name("chenweiwei")
                                                                .email("chenweiwei@example.com")
                                                                .url("https://gitee.com/oxygen_oO")))
                                // 添加外部文档链接
                                .externalDocs(new ExternalDocumentation()
                                                .description("MinIO文件上传系统使用文档")
                                                .url("https://gitee.com/oxygen_oO/minio-upload/blob/master/README.md"))
                                // 添加服务地址
                                .servers(servers());
        }

        /**
         * 配置API分组 - 上传接口组
         *
         * @return 上传接口的API分组
         */
        @Bean
        public GroupedOpenApi uploadApi() {
                return GroupedOpenApi.builder()
                                .group("上传接口")
                                .pathsToMatch("/api/upload/**")
                                .packagesToScan("net.oxygen.upload.controller")
                                .build();
        }

        /**
         * 配置服务地址列表
         *
         * @return 服务器列表
         */
        private List<Server> servers() {
                List<Server> servers = new ArrayList<>();

                Server devServer = new Server();
                devServer.setUrl("http://localhost:8080");
                devServer.setDescription("开发环境");

                Server testServer = new Server();
                testServer.setUrl("http://test-api.example.com");
                testServer.setDescription("测试环境");

                servers.add(devServer);
                servers.add(testServer);

                return servers;
        }
}
